package com.sumainfor.pc.gmio.service.impl;

import com.sumainfor.common.Constants;
import com.sumainfor.common.util.ContextUtils;
import com.sumainfor.common.util.DateUtils;
import com.sumainfor.common.util.HttpUtilBee;
import com.sumainfor.common.util.JsonResult;
import com.sumainfor.common.utlis.ComUtils;
import com.sumainfor.common.utlis.ParamsCommon;
import com.sumainfor.common.wechat.WeChatConfig;
import com.sumainfor.common.wechat.WxConstant;
import com.sumainfor.common.wechat.WxEncodeUtil;
import com.sumainfor.common.wechat.weUtil.WXPayConstants;
import com.sumainfor.common.wechat.weUtil.WXPayUtil;
import com.sumainfor.pc.gmio.dao.*;
import com.sumainfor.pc.gmio.feign.Zfeign.ZpcMktFeign;
import com.sumainfor.pc.gmio.feign.Zfeign.ZwxTenantFeign;
import com.sumainfor.pc.gmio.feign.ZuulFeign.ZuulFeign;
import com.sumainfor.pc.gmio.service.SeBpwService;
import com.sumainfor.pc.gmio.service.SeDoubtService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 微信支付的订单信息
 */
@Service
public class SeBpwServiceImpl implements SeBpwService,Serializable {

    private ReentrantLock lock = new ReentrantLock(false);

    Logger log = LoggerFactory.getLogger(SeDoubtService.class);// 日志

    @Autowired
    private SeBpwMapper seBpwMapper;
    @Autowired
    private UtilsMapper utilsMapper;
    @Autowired
    private ZuulFeign zuulFeign;
    @Autowired
    private ZwxTenantFeign zwxTenantFeign;
    @Autowired
    private HoTenantBillMapper hoTenantBillMapper;
    @Autowired
    private ZpcMktFeign zpcMktFeign;
    @Autowired
    private SeBillPayMapper seBillPayMapper;
    @Autowired
    private SeTenantBillMapper seTenantBillMapper;
    /**
     * 续签合同的时候把上一份合同的账单在微信统一下单（生成预付订单）
     */
    @Override
    public JsonResult getUnifiedorder(Map<String, Object> params) {
        JsonResult result = new JsonResult();
        Map<String,Object> dataMap=new HashMap<String,Object>();
        BigDecimal total_fee=new BigDecimal("0");//保存账单总价
        //优惠卷面值
        BigDecimal bigFacevalue=new BigDecimal("0");
        //组装请求微信预订单用的参数
        Map<String,String> paramsXml=new HashMap<String,String>();
        if ( params.get("openid")==null || params.get("spbill_create_ip")==null
                || params.get("unPaidList")==null || params.get("IfCoucode")==null || params.get("Source")==null){
            return result.putFailed("参数不正确");
        }
        //如果使用了优惠卷就判断相关的参数是否为空  IfCoucode0未使用优惠卷 1使用了优惠卷
        if (params.get("IfCoucode").toString().equals("1")){
            if (params.get("Coucode")==null || params.get("Facevalue")==null){
                return result.putFailed("参数不正确");
            }else {
                //如果使用了优惠卷并且优惠卷相关的参数不为空的时候修改优惠卷已使用
                bigFacevalue=new BigDecimal(params.get("Facevalue").toString());
            }
        }
        if (params.get("iFseBpw").toString().equals("0")){
            //获取权限当前公司的微信支付
            JsonResult zuulResult=zuulFeign.getAreaPayMap(params);
            if (!zuulResult.get("errorCode").toString().equals("0")){
                //如果查询不到就用默认的商户号
                paramsXml.put("mch_id",WeChatConfig.DEFAULT_MCH_ID);//商户号
            }else{
                Map<String,Object> zuulMap=(Map<String,Object>)zuulResult.get("result");
                //支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
                if (zuulMap.get("ServeType").toString().equals("1")){
                    paramsXml.put("mch_id",zuulMap.get("SubMchId").toString());//商户号
                    paramsXml.put("sub_mch_id",zuulMap.get("MchId").toString());//商户号
                }else{
                    paramsXml.put("mch_id",zuulMap.get("MchId").toString());//商户号
                }
            }
        }else{
            paramsXml.put("mch_id", params.get("mch_id").toString());//商户号
            if (params.get("ServeType").toString().equals("1")){//支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
                paramsXml.put("sub_mch_id", params.get("sub_mch_id").toString());//商户号
            }
        }
        //未支付账单的全部账单
        List<Map<String,Object>> unPaidList=(List<Map<String,Object>>)params.get("unPaidList");
        //计算本次支付的总和
        for(Map<String,Object> unPaidMap: unPaidList){
            total_fee=total_fee.add(new BigDecimal(unPaidMap.get("BiMoney").toString()));
        }
        System.out.println("unPaidList:"+unPaidList);
        //未支付账单总和-优惠卷面值
        total_fee=total_fee.subtract(bigFacevalue);
        System.out.println("total_fee:"+total_fee);
        System.out.println("bigFacevalue:"+bigFacevalue);
        //查询是否已经有预订单信息如果没有再去请求微信的预订单接口
        Map<String,Object> seBpwMap=seBpwMapper.getSeBpw(params);
        if (seBpwMap==null){
            //返回给前端调起支付用的参数
            Map<String,String> signMap=new HashMap<String, String>();

            paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
            paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串32
            paramsXml.put("body","房屋租金-"+total_fee.toString());//订单详情
            paramsXml.put("out_trade_no",params.get("Source").toString());//商户订单号
//            paramsXml.put("total_fee",total_fee.multiply(new BigDecimal("100")).setScale(0).toString());//标价金额
            paramsXml.put("total_fee","1");//标价金额
            paramsXml.put("spbill_create_ip",params.get("spbill_create_ip").toString());//终端ip
            paramsXml.put("notify_url","http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php");
            paramsXml.put("trade_type","JSAPI");
            paramsXml.put("openid",params.get("openid").toString());
            try {
                paramsXml.put("sign",WXPayUtil.generateSignature(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                System.out.println("签名是否正确1:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
                //发送统一下单请求
                String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDER_URL,WXPayUtil.generateSignedXml
                        (paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5));
                System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
                Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
                System.out.println("微信预订单参数resultMap:"+resultMap);

                //当预订单请求成功的时候保存预订单的信息到数据库中
                if (resultMap.get("return_code").toString().equals("SUCCESS")){
                    //组装返回给前端的JSAPI调用支付参数
                    signMap.put("appId",WeChatConfig.APP_ID);
                    signMap.put("timeStamp",String.valueOf(WXPayUtil.getCurrentTimestamp()));
                    signMap.put("nonceStr",WXPayUtil.generateNonceStr());
                    signMap.put("package","prepay_id="+resultMap.get("prepay_id"));//支付编号
                    signMap.put("signType",WXPayConstants.SignType.MD5.toString());
                    signMap.put("paySign",WXPayUtil.generateSignature(signMap,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                    //保存唤起微信支付的参数
                    Map<String,Object> bpwMap=new HashMap<String,Object>();
                    bpwMap.put("SouType","1");//未支付账单类型   1.房租（合同） 2.公共事业费  3.维修费用  4.延期退审核  5.其他费用  6.退租账单 7.夜间开门
                    bpwMap.put("Source",params.get("Source"));//房屋的合同编号（即这里的来源编号）
                    bpwMap.put("appId",WeChatConfig.APP_ID);//公众号appid
                    bpwMap.put("timeStamp",signMap.get("timeStamp"));//时间戳
                    bpwMap.put("nonceStr",signMap.get("nonceStr"));//随机字符串
                    bpwMap.put("prepayId",signMap.get("package"));//微信支付订单编号
                    bpwMap.put("sign",paramsXml.get("sign"));
                    bpwMap.put("paySign",signMap.get("paySign"));//微信签名
                    bpwMap.put("by", "auto");//操作人
                    bpwMap.put("Coucode",params.get("Coucode"));//优惠卷编号
                    bpwMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    bpwMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(bpwMap);
                    seBpwMapper.addSeBpw(bpwMap);
                }
                System.out.println("JSAPI调用支付需要的参数signMap:"+signMap);
                System.out.println("签名是否正确3:"+WXPayUtil.isSignatureValid(signMap,WxConstant.WECHATPAY_PAY_APPSECRET));
            } catch (Exception e) {
                e.printStackTrace();
                result.putFailed("服务器繁忙");
            }
            dataMap.put("signMap",signMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",paramsXml.get("out_trade_no"));//订单号
        }else{
            dataMap.put("signMap",seBpwMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",seBpwMap.get("Source"));//订单号
        }
        params.get("paramsXml"+paramsXml);
        dataMap.put("unPaidList",unPaidList);//未支付的账单列表
        dataMap.put("total_fee",total_fee);//账单金额
        dataMap.put("mch_id",paramsXml.get("mch_id"));//商户号

        return result.put(dataMap);
    }
    /**
     *续签合同的时候把上一份合同的账单全部支付完成(查询微信订单的支付状态)
     */
    public JsonResult getOrderQuery(Map<String,Object> params){
        JsonResult result=new JsonResult();
        BigDecimal BiMoney=new BigDecimal("0");//账单金额
        Integer count1=0;//优惠卷是否已经使用
        Integer count2=0;//未支付账单是否修改成功
        Map<String,Object> billMap=new HashMap<String,Object>();
        if (params.get("mch_id")==null || params.get("PaId")==null
                || params.get("sourceList")==null || params.get("IfCoucode")==null || params.get("CorId")==null
                ||params.get("Source")==null || params.get("total_fee")==null || params.get("TenId")==null
                || params.get("HouId")==null || params.get("HouInfoId")==null){
            return result.putFailed("参数不正确");
        }
        BiMoney=new BigDecimal(params.get("total_fee").toString());
        //如果使用了优惠卷就判断相关的参数是否为空  IfCoucode0未使用优惠卷 1使用了优惠卷
        if (params.get("IfCoucode").toString().equals("1")){
            if (params.get("Coucode")==null || params.get("Facevalue")==null){
                return result.putFailed("参数不正确");
            }else {
                //BiMoney 代表是账单金额 即不减去优惠卷之前的金额
                BiMoney=BiMoney.add(new BigDecimal(params.get("Facevalue").toString()));
                //如果使用了优惠卷并且优惠卷相关的参数不为空的时候修改优惠卷已使用
                zwxTenantFeign.updateHotc(params);
            }
        }
        //组装请求查询微信订单的参数
        Map<String,String> paramsXml=new HashMap<String, String>();
        paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
        paramsXml.put("mch_id", params.get("mch_id").toString());//商户号
        if (params.get("ServeType").toString().equals("1")){
            paramsXml.put("sub_mch_id", params.get("sub_mch_id").toString());//商户号
        }
        paramsXml.put("out_trade_no",params.get("PaId").toString());//商户订单号
        paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串
        paramsXml.put("sign_type",WXPayConstants.SignType.MD5.toString());
        try {
            //签名
            paramsXml.put("sign", WXPayUtil.generateSignature(paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5).toUpperCase());
            System.out.println("签名是否正确1:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
            //查询微信订单的信息
            String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDERQUERY_URL, WXPayUtil.generateSignedXml
                    (paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5));
            System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
            Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
            System.out.println("查询订单返回的信息:"+resultMap);
            if (resultMap.get("return_code").toString().equals("SUCCESS")){
                if (resultMap.get("trade_state").toString().equals("SUCCESS")){
                    //如果支付成功就去修改上一份合同未支付的账单为废弃，然后再新增一个续签账单及续签账单支付信息
                    params.put("Status","4");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    params.put("IfFlowPay","2");//电子合同是否支付     0无状态   1已完成未支付   \n2已完成已支付  3待审核（水电押金上传之后需要审核）
                    params.put("RentStatus","2");//房租/押金     支付状态   0不需要支付   1.待支付   2支付完成',
                    params.put("Hydropower","2");//水电押金   支付状态   0不需要支付   1.待支付   2支付完成    3待审核
                    params.put("by", "auto");//操作人
                    params.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    params.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(params);
                    //续签的时候支付完上一份合同的账单后修改账单为已废弃
                    System.out.println("params:"+params);
                    List<Map<String,Object>> hoStatusList=(List<Map<String,Object>>)params.get("sourceList");
                    String BillExplain="";//保存账单说明
                    List<String> timeList=new ArrayList<String>();//保存账单开始时间和结束时间
                    params.put("Source",params.get("Source"));
                    hoTenantBillMapper.updateHoStatusDelfg(params);
                    for (Map<String,Object> hoStatusMap:hoStatusList){
                        if (hoStatusMap.get("BiId")!=null){
                            params.put("Source",hoStatusMap.get("Source"));
                            BillExplain=BillExplain+hoStatusMap.get("BiName")+":"+hoStatusMap.get("BiMoney")+",";
                            timeList.add(hoStatusMap.get("BiGenerated").toString());//开始时间
                            timeList.add(hoStatusMap.get("EndTime").toString());//结束时间
                        }
                    }
                    //时间数组排序
                    List<String> newTimeList=DateUtils.sortListDesc(timeList);
                    //组装续签账单参数
                    Map<String,Object> tenBillMap=new HashMap<String,Object>();
                    //账单编号
                    String UUID="";
                    Map<String,Object>uuid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "BiId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_tenant_bill");
                    }});

                    if(uuid!=null &&(!uuid.get("uuid").toString().equals(""))){
                        Integer number=Integer.valueOf(uuid.get("uuid").toString());
                        UUID= ComUtils.getLocalTrmSeqNum("bi",number);
                    }else{
                        UUID=ComUtils.getLocalTrmSeqNum("bi",0);
                    }
                    //支付信息编号
                    String UUID2="";
                    Map<String,Object>uuid2=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "PayId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_bill_pay");
                    }});

                    if(uuid2!=null &&(!uuid2.get("uuid").toString().equals(""))){
                        Integer number=Integer.valueOf(uuid2.get("uuid").toString());
                        UUID2= ComUtils.getLocalTrmSeqNum("bi",number);
                    }else{
                        UUID2=ComUtils.getLocalTrmSeqNum("bi",0);
                    }
                    tenBillMap.put("BiId",UUID);//账单编号
                    tenBillMap.put("PayId",UUID2);//支付信息编号
                    tenBillMap.put("CorId",params.get("CorId"));//公司编号
                    tenBillMap.put("MainBody",0);//账单主体类型   0.普通账单    1.企业账单
                    tenBillMap.put("BiName","续签原合同账单");//账单名称
                    tenBillMap.put("IfTemporary",0);//是否是临时账单    0.否   1.是\n没有关联来源
                    tenBillMap.put("BiType",9);//账单类型  1.房租（合同） 2.公共事业费  3.维修费用  \n4.延期退  5.其他费用  6.退租账单 7.夜间开门   8.智能电表  9.续签剩余原合同总账单',
                    tenBillMap.put("Source",params.get("Source"));//账单来源编号
                    tenBillMap.put("FirstMon","0");//房租账单是否是首月    0否   1.是
                    tenBillMap.put("BiMoney",BiMoney);//账单金额
                    tenBillMap.put("BillExplain",BillExplain);//账单金额说明,多个逗号隔开
                    tenBillMap.put("BiGenerated",newTimeList.get(newTimeList.size()-1));//账单生成时间
                    tenBillMap.put("EndTime",newTimeList.get(0));//账单生成时间
                    tenBillMap.put("LateDay",newTimeList.get(0));//账单最晚付款日
                    tenBillMap.put("TenId",params.get("TenId"));//租客编号
                    tenBillMap.put("HouId",params.get("HouId"));//房源编号
                    tenBillMap.put("HouInfoId",params.get("HouInfoId"));//房源详表编号
                    tenBillMap.put("CreateType",1);//账单创建人类型  1.系统  2.人为
                    tenBillMap.put("ExpStatus",0);//账单逾期状态   0.未逾期  1逾期
                    tenBillMap.put("ExpTime",tenBillMap.get("EndTime"));//逾期开始时间
                    tenBillMap.put("Status",2);//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    tenBillMap.put("Abnormal",0);//账单异常状态   0正常   1异常
                    tenBillMap.put("by", "auto");//操作人
                    tenBillMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenBillMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(tenBillMap);
                    //新增账单
                    seTenantBillMapper.addTenantBill(tenBillMap);
                    //组装支付信息参数
                    Map<String,Object> tenPayMap=new HashMap<String,Object>();
                    tenPayMap.put("PayId",UUID2);
                    tenPayMap.put("TenId",params.get("TenId"));//租客编号
                    tenPayMap.put("Shape",0);//0.线上   1.线下
                    tenPayMap.put("PayMode",1);//支付方式  1.微信  2.支付宝
                    tenPayMap.put("TransactionId",params.get("Source"));//0.线上   1.线下
                    tenPayMap.put("BiMoney",BiMoney);//账单金额
                    tenPayMap.put("PayMoney",params.get("total_fee"));//账单金额
                    tenPayMap.put("Couponcd",params.get("Coucode"));//优惠卷编号
                    tenPayMap.put("Couponamt",params.get("Facevalue"));//优惠卷金额
                    tenPayMap.put("PatStatus",0);//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
                    tenPayMap.put("PatStats",2);//支付状态    1.未支付  2.支付成功
                    tenPayMap.put("by", "auto");//操作人
                    tenPayMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenPayMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(tenPayMap);
                    tenPayMap.put("PayTime",tenPayMap.get("instm"));//本次支付时间
                    //新增支付信息
                    seBillPayMapper.addSeBillPay(tenPayMap);
                    billMap.put("trade_state",resultMap.get("trade_state"));
                }
                billMap.put("return_code",resultMap.get("return_code"));//SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看trade_state来判断
                billMap.put("return_msg",resultMap.get("return_msg"));//当return_code为FAIL时返回信息为错误原因 ，例如签名失败 参数格式校验错误，
                billMap.put("result_code",resultMap.get("result_code"));//业务结果 SUCCESS/FAIL
                billMap.put("err_code",resultMap.get("result_code"));//ORDERNOTEXIST 此交易订单号不存在 SYSTEMERROR 系统错误
                billMap.put("err_code_des",resultMap.get("err_code_des"));//当result_code为FAIL时返回错误描述，
                System.out.println("billMap.:"+billMap);
                result.put(billMap);
            }else{
                result.putFailed("服务器繁忙");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     *微信关闭预订单
     */
    public JsonResult CloseOrder(Map<String,Object> params){
        JsonResult result=new JsonResult();
        Map<String,Object> dataMap=new HashMap<String,Object>();
        if (params.get("out_trade_no")==null){
            return result.putFailed("服务器繁忙");
        }
        //微信关闭订单的参数
        Map<String,String> paramsXml=new HashMap<String,String>();
        paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
        paramsXml.put("out_trade_no",params.get("out_trade_no").toString());//商户订单号
        paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串
        paramsXml.put("sign",WXPayConstants.SignType.MD5.toString());
        //获取权限当前公司的微信支付
        JsonResult zuulResult=zuulFeign.getAreaPayMap(params);
        if (!zuulResult.get("errorCode").toString().equals("0")){
            //如果查询不到就用默认的商户号
            paramsXml.put("mch_id",WeChatConfig.DEFAULT_MCH_ID);//商户号
        }else{
            Map<String,Object> zuulMap=(Map<String,Object>)zuulResult.get("result");
            //支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
            if (zuulMap.get("ServeType").toString().equals("1")){
                paramsXml.put("mch_id",zuulMap.get("SubMchId").toString());//商户号
                paramsXml.put("sub_mch_id",zuulMap.get("MchId").toString());//商户号
            }else{
                paramsXml.put("mch_id",zuulMap.get("MchId").toString());//商户号
            }
        }
        //返回给前端调起支付用的参数
        Map<String,String> signMap=new HashMap<String, String>();

        try {
            paramsXml.put("sign", WXPayUtil.generateSignature(paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5).toUpperCase());
            System.out.println("签名是否正确:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
            String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_CLOSE_ORDER, WXPayUtil.generateSignedXml
                    (paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5));
            System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
            Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
            System.out.println("resultMap:"+resultMap);
            if (resultMap.get("return_code").toString().equals("SUCCESS")){
                params.put("by", "auto");//操作人
                params.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                params.put("fnc",
                        this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                ParamsCommon.commonInsertParms(params);
                params.put("delfg",1);//废弃标志位 0正常 1废弃
                params.put("Source",params.get("out_trade_no"));//来源编号
                seBpwMapper.updateSeBpw(params);
            }
            dataMap.put("return_code",resultMap.get("return_code"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  result.put(dataMap);
    }

    /**
     * 租客端续签的时候查询续签合同的信息（生成预付订单）
     */
    @Override
    public JsonResult getRenUnifiedorder(Map<String, Object> params) {
        log.info("续签合同生成预付订单params："+params);
        JsonResult result = new JsonResult();
        Map<String,Object> dataMap=new HashMap<String,Object>();
        BigDecimal total_fee=new BigDecimal("0");//保存账单总价
        //优惠卷面值
        BigDecimal bigFacevalue=new BigDecimal("0");
        //组装请求微信预订单用的参数
        Map<String,String> paramsXml=new HashMap<String,String>();
        if ( params.get("openid")==null || params.get("spbill_create_ip")==null || params.get("iFseBpw")==null
                || params.get("total_fee")==null || params.get("IfCoucode")==null || params.get("Source")==null){
            return result.putFailed("参数不正确");
        }
        //如果使用了优惠卷就判断相关的参数是否为空  IfCoucode0未使用优惠卷 1使用了优惠卷
        if (params.get("IfCoucode").toString().equals("1")){
            if (params.get("Coucode")==null || params.get("Facevalue")==null){
                return result.putFailed("参数不正确");
            }else {
                //如果使用了优惠卷并且优惠卷相关的参数不为空的时候修改优惠卷已使用
                bigFacevalue=new BigDecimal(params.get("Facevalue").toString());
            }
        }
        if (params.get("iFseBpw").toString().equals("0")){
            //获取权限当前公司的微信支付
            JsonResult zuulResult=zuulFeign.getAreaPayMap(params);
            if (!zuulResult.get("errorCode").toString().equals("0")){
                //如果查询不到就用默认的商户号
                paramsXml.put("mch_id",WeChatConfig.DEFAULT_MCH_ID);//商户号
            }else{
                Map<String,Object> zuulMap=(Map<String,Object>)zuulResult.get("result");
                //支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
                if (zuulMap.get("ServeType").toString().equals("1")){
                    paramsXml.put("mch_id",zuulMap.get("SubMchId").toString());//商户号
                    paramsXml.put("sub_mch_id",zuulMap.get("MchId").toString());//商户号
                }else{
                    paramsXml.put("mch_id",zuulMap.get("MchId").toString());//商户号
                }
            }
        }else{
            paramsXml.put("mch_id", params.get("mch_id").toString());//商户号
            if (params.get("ServeType").toString().equals("1")){//支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
                paramsXml.put("sub_mch_id", params.get("sub_mch_id").toString());//商户号
            }
        }
        //计算本次支付的总和
        total_fee=new BigDecimal(params.get("total_fee").toString());
        //未支付账单总和-优惠卷面值
        total_fee=total_fee.subtract(bigFacevalue);

        System.out.println("total_fee:"+total_fee);
        System.out.println("bigFacevalue:"+bigFacevalue);
        //查询是否已经有预订单信息如果没有再去请求微信的预订单接口
        Map<String,Object> seBpwMap=seBpwMapper.getSeBpw(params);
        if (seBpwMap==null){
            //返回给前端调起支付用的参数
            Map<String,String> signMap=new HashMap<String, String>();
            paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
            paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串32
            paramsXml.put("body","房屋租金-"+total_fee.toString());//订单详情
            paramsXml.put("out_trade_no",params.get("Source").toString());//商户订单号
//            paramsXml.put("total_fee",total_fee.multiply(new BigDecimal("100")).setScale(0).toString());//标价金额
            paramsXml.put("total_fee","1");//标价金额
            paramsXml.put("spbill_create_ip",params.get("spbill_create_ip").toString());//终端ip
            paramsXml.put("notify_url","http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php");
            paramsXml.put("trade_type","JSAPI");
            paramsXml.put("openid",params.get("openid").toString());
            try {
                paramsXml.put("sign",WXPayUtil.generateSignature(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                System.out.println("签名是否正确1:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
                //发送统一下单请求
                String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDER_URL,WXPayUtil.generateSignedXml
                        (paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5));
                System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
                Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
                System.out.println("微信预订单参数resultMap:"+resultMap);
                //当预订单请求成功的时候保存预订单的信息到数据库中
                if (resultMap.get("return_code").toString().equals("SUCCESS")){
                    //组装返回给前端的JSAPI调用支付参数
                    signMap.put("appId",WeChatConfig.APP_ID);
                    signMap.put("timeStamp",String.valueOf(WXPayUtil.getCurrentTimestamp()));
                    signMap.put("nonceStr",WXPayUtil.generateNonceStr());
                    signMap.put("package","prepay_id="+resultMap.get("prepay_id"));//支付编号
                    signMap.put("signType",WXPayConstants.SignType.MD5.toString());
                    signMap.put("paySign",WXPayUtil.generateSignature(signMap,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                    //保存唤起微信支付的参数
                    Map<String,Object> bpwMap=new HashMap<String,Object>();
                    bpwMap.put("SouType","1");//未支付账单类型   1.房租（合同） 2.公共事业费  3.维修费用  4.延期退审核  5.其他费用  6.退租账单 7.夜间开门
                    bpwMap.put("Source",params.get("Source"));//房屋的合同编号（即这里的来源编号）
                    bpwMap.put("appId",WeChatConfig.APP_ID);//公众号appid
                    bpwMap.put("timeStamp",signMap.get("timeStamp"));//时间戳
                    bpwMap.put("nonceStr",signMap.get("nonceStr"));//随机字符串
                    bpwMap.put("prepayId",signMap.get("package"));//微信支付订单编号
                    bpwMap.put("sign",paramsXml.get("sign"));
                    bpwMap.put("paySign",signMap.get("paySign"));//微信签名
                    bpwMap.put("by", "auto");//操作人
                    bpwMap.put("Coucode",params.get("Coucode"));//优惠卷编号
                    bpwMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    bpwMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(bpwMap);
                    seBpwMapper.addSeBpw(bpwMap);
                }
                System.out.println("JSAPI调用支付需要的参数signMap:"+signMap);
                System.out.println("签名是否正确3:"+WXPayUtil.isSignatureValid(signMap,WxConstant.WECHATPAY_PAY_APPSECRET));
            } catch (Exception e) {
                e.printStackTrace();
                result.putFailed("服务器繁忙");
            }
            signMap.put("IfCoucode","0");
            signMap.put("Facevalue","");
            signMap.put("Coucode","");
            signMap.put("Source",params.get("Source").toString());
            dataMap.put("signMap",signMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",paramsXml.get("out_trade_no"));//订单号
        }else{
            dataMap.put("signMap",seBpwMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",seBpwMap.get("Source"));//订单号
        }
        dataMap.put("total_fee",total_fee);//账单金额
        dataMap.put("mch_id",paramsXml.get("mch_id"));//商户号
        log.info("续签合同生成预付订单result："+dataMap);
        return result.put(dataMap);
    }
    /**
     *续签合同修改为已支付(查询微信订单的支付状态)如果成功就修改合同及账单信息
     */
    @Override
    public JsonResult getRenOrderQuery(Map<String,Object> params){
        log.info("续签合同params："+params);
        JsonResult result=new JsonResult();
        BigDecimal BiMoney=new BigDecimal("0");//账单金额
        Integer count1=0;//优惠卷是否已经使用
        Integer count2=0;//未支付账单是否修改成功
        Map<String,Object> billMap=new HashMap<String,Object>();
        if (  params.get("IfCoucode")==null || params.get("ServeType")==null || params.get("mch_id")==null
                || params.get("sub_mch_id")==null
                ||params.get("Source")==null || params.get("total_fee")==null || params.get("TenId")==null
        ){
            return result.putFailed("参数不正确");
        }
        BiMoney=new BigDecimal(params.get("total_fee").toString());
        //如果使用了优惠卷就判断相关的参数是否为空  IfCoucode0未使用优惠卷 1使用了优惠卷
        if (params.get("IfCoucode").toString().equals("1")){
            if (params.get("Coucode")==null || params.get("Facevalue")==null){
                return result.putFailed("参数不正确");
            }else {
                //BiMoney 代表是账单金额 即不减去优惠卷之前的金额
                BiMoney=BiMoney.add(new BigDecimal(params.get("Facevalue").toString()));
                //如果使用了优惠卷并且优惠卷相关的参数不为空的时候修改优惠卷已使用
                zwxTenantFeign.updateHotc(params);
            }
        }
        //组装请求查询微信订单的参数
        Map<String,String> paramsXml=new HashMap<String, String>();
        paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
        paramsXml.put("mch_id", params.get("mch_id").toString());//商户号
        if (params.get("ServeType").toString().equals("1")){//支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
            paramsXml.put("sub_mch_id", params.get("sub_mch_id").toString());//商户号
        }
        paramsXml.put("out_trade_no",params.get("Source").toString());//商户订单号
        paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串
        paramsXml.put("sign_type",WXPayConstants.SignType.MD5.toString());
        try {
            //签名
            paramsXml.put("sign", WXPayUtil.generateSignature(paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5).toUpperCase());
            System.out.println("签名是否正确1:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
            //查询微信订单的信息
            String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDERQUERY_URL, WXPayUtil.generateSignedXml
                    (paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5));
            System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
            Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
            System.out.println("查询订单返回的信息:"+resultMap);
            if (resultMap.get("return_code").toString().equals("SUCCESS")){
                if (resultMap.get("trade_state").toString().equals("SUCCESS")){
                    //房租账单支付完成到市场部修改合同信息
                    zpcMktFeign.updatePactByRent(new HashMap<String, Object>(){{
                        put("PaId",params.get("Source"));//合同编号
                    }});
                    //支付信息编号
                    String UUID="";
                    Map<String,Object>uuid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "PayId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_bill_pay");
                    }});

                    if(uuid!=null &&(!uuid.get("uuid").toString().equals(""))){
                        Integer number=Integer.valueOf(uuid.get("uuid").toString());
                        UUID= ComUtils.getLocalTrmSeqNum("bi",number);
                    }else{
                        UUID=ComUtils.getLocalTrmSeqNum("bi",0);
                    }
                    //组装支付信息参数
                    Map<String,Object> tenPayMap=new HashMap<String,Object>();
                    tenPayMap.put("PayId",UUID);
                    tenPayMap.put("TenId",params.get("TenId"));//租客编号
                    tenPayMap.put("Shape",0);//0.线上   1.线下
                    tenPayMap.put("PayMode",1);//支付方式  1.微信  2.支付宝
                    tenPayMap.put("TransactionId",params.get("Source"));//0.线上   1.线下
                    tenPayMap.put("BiMoney",BiMoney);//账单金额
                    tenPayMap.put("PayMoney",params.get("total_fee"));//支付的金额
                    tenPayMap.put("Couponcd",params.get("Coucode"));//优惠卷编号
                    tenPayMap.put("Couponamt",params.get("Facevalue"));//优惠卷金额
                    tenPayMap.put("PatStatus",0);//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
                    tenPayMap.put("PatStats",2);//支付状态    1.未支付  2.支付成功
                    tenPayMap.put("by", "auto");//操作人
                    tenPayMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenPayMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(tenPayMap);
                    tenPayMap.put("PayTime",tenPayMap.get("instm"));//本次支付时间
                    //新增支付信息
                    seBillPayMapper.addSeBillPay(tenPayMap);
                    //组装修改账单参数
                    Map<String,Object> renBillMap=new HashMap<String,Object>();
                    renBillMap.put("Source",params.get("Source"));
                    renBillMap.put("Status",2);//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    renBillMap.put("PayId",UUID);//支付信息编号
                    renBillMap.put("by", "auto");//操作人
                    renBillMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    renBillMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(renBillMap);
                    seTenantBillMapper.updateSeRenBill(renBillMap);
                    billMap.put("trade_state",resultMap.get("trade_state"));
                }
                billMap.put("return_code",resultMap.get("return_code"));//SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看trade_state来判断
                billMap.put("return_msg",resultMap.get("return_msg"));//当return_code为FAIL时返回信息为错误原因 ，例如签名失败 参数格式校验错误，
                billMap.put("result_code",resultMap.get("result_code"));//业务结果 SUCCESS/FAIL
                billMap.put("err_code",resultMap.get("result_code"));//ORDERNOTEXIST 此交易订单号不存在 SYSTEMERROR 系统错误
                billMap.put("err_code_des",resultMap.get("err_code_des"));//当result_code为FAIL时返回错误描述，
                System.out.println("billMap.:"+billMap);
                result.put(billMap);
            }else{
                result.putFailed("服务器繁忙");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("续签合同生result："+result);
        return result;
    }


    /**
     * 租客端延期退（生成预付订单）
     */
    @Override
    public JsonResult getDelayUnifiedorder(Map<String, Object> params) {
        JsonResult result = new JsonResult();
        Map<String,Object> dataMap=new HashMap<String,Object>();
        BigDecimal total_fee=new BigDecimal("0");//保存账单总价
        //组装请求微信预订单用的参数
        Map<String,String> paramsXml=new HashMap<String,String>();
        if (params.get("AreaId")==null || params.get("openid")==null || params.get("spbill_create_ip")==null
                || params.get("total_fee")==null  || params.get("Source")==null){
            return result.putFailed("参数不正确");
        }
        String Source=params.put("Source",params.get("Source").toString()+"1").toString();
        Source=Source.concat("1");
        System.out.println("Source:"+Source);
        params.put("Source",Source);
        //获取权限当前公司的微信支付
        JsonResult zuulResult=zuulFeign.getAreaPayMap(params);
        System.out.println("zuulResult："+zuulResult);
        if (!zuulResult.get("errorCode").toString().equals("0")){
            //如果查询不到就用默认的商户号
            paramsXml.put("mch_id",WeChatConfig.DEFAULT_MCH_ID);//商户号
            dataMap.put("mch_id",paramsXml.get("mch_id"));
            dataMap.put("sub_mch_id","");
            dataMap.put("ServeType","2");
        }else{
            Map<String,Object> zuulMap=(Map<String,Object>)zuulResult.get("result");
            //支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
            if (zuulMap.get("ServeType").toString().equals("1")){
                paramsXml.put("mch_id",zuulMap.get("SubMchId").toString());//商户号
                paramsXml.put("sub_mch_id",zuulMap.get("MchId").toString());//商户号
                dataMap.put("mch_id",paramsXml.get("mch_id"));
                dataMap.put("sub_mch_id",paramsXml.get("sub_mch_id"));
            }else{
                paramsXml.put("mch_id",zuulMap.get("MchId").toString());//商户号
                dataMap.put("mch_id",paramsXml.get("mch_id"));
                dataMap.put("sub_mch_id","");
            }
            dataMap.put("ServeType",zuulMap.get("ServeType"));
        }
        //计算本次支付的总和
        total_fee=new BigDecimal(params.get("total_fee").toString());
        System.out.println("total_fee:"+total_fee);

        //查询是否已经有预订单信息如果没有再去请求微信的预订单接口
        Map<String,Object> seBpwMap=seBpwMapper.getSeBpw(params);
        if (seBpwMap==null){

            //返回给前端调起支付用的参数
            Map<String,String> signMap=new HashMap<String, String>();
//            params.put("Source",params.get("Source")+"1");
            paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
            paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串32
            paramsXml.put("body","房屋租金-"+total_fee.toString());//订单详情
            paramsXml.put("out_trade_no",Source);//商户订单号
//            paramsXml.put("total_fee",total_fee.multiply(new BigDecimal("100")).setScale(0).toString());//标价金额
            paramsXml.put("total_fee","1");//标价金额
            paramsXml.put("spbill_create_ip",params.get("spbill_create_ip").toString());//终端ip
            paramsXml.put("notify_url","http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php");
            paramsXml.put("trade_type","JSAPI");
            paramsXml.put("openid",params.get("openid").toString());
            try {
                paramsXml.put("sign",WXPayUtil.generateSignature(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                System.out.println("签名是否正确1:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
                //发送统一下单请求
                String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDER_URL,WXPayUtil.generateSignedXml
                        (paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5));
                System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
                Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
                System.out.println("微信预订单参数resultMap:"+resultMap);
                //当预订单请求成功的时候保存预订单的信息到数据库中
                if (resultMap.get("return_code").toString().equals("SUCCESS")){
                    //组装返回给前端的JSAPI调用支付参数
                    signMap.put("appId",WeChatConfig.APP_ID);
                    signMap.put("timeStamp",String.valueOf(WXPayUtil.getCurrentTimestamp()));
                    signMap.put("nonceStr",WXPayUtil.generateNonceStr());
                    signMap.put("package","prepay_id="+resultMap.get("prepay_id"));//支付编号
                    signMap.put("signType",WXPayConstants.SignType.MD5.toString());
                    signMap.put("paySign",WXPayUtil.generateSignature(signMap,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                    //保存唤起微信支付的参数
                    Map<String,Object> bpwMap=new HashMap<String,Object>();
                    bpwMap.put("SouType","1");//未支付账单类型   1.房租（合同） 2.公共事业费  3.维修费用  4.延期退审核  5.其他费用  6.退租账单 7.夜间开门
                    bpwMap.put("Source",Source);//房屋的合同编号（即这里的来源编号）
                    bpwMap.put("appId",WeChatConfig.APP_ID);//公众号appid
                    bpwMap.put("timeStamp",signMap.get("timeStamp"));//时间戳
                    bpwMap.put("nonceStr",signMap.get("nonceStr"));//随机字符串
                    bpwMap.put("prepayId",signMap.get("package"));//微信支付订单编号
                    bpwMap.put("sign",paramsXml.get("sign"));
                    bpwMap.put("paySign",signMap.get("paySign"));//微信签名
                    bpwMap.put("by", "auto");//操作人
                    bpwMap.put("Coucode",params.get("Coucode"));//优惠卷编号
                    bpwMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    bpwMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(bpwMap);
                    seBpwMapper.addSeBpw(bpwMap);
                }
                System.out.println("JSAPI调用支付需要的参数signMap:"+signMap);
                System.out.println("签名是否正确3:"+WXPayUtil.isSignatureValid(signMap,WxConstant.WECHATPAY_PAY_APPSECRET));
            } catch (Exception e) {
                e.printStackTrace();
                result.putFailed("服务器繁忙");
            }
            dataMap.put("signMap",signMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",paramsXml.get("out_trade_no"));//订单号
        }else{
            dataMap.put("signMap",seBpwMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",seBpwMap.get("Source"));//订单号
        }
        dataMap.put("total_fee",total_fee);//账单金额
        dataMap.put("PaId",Source);//原合同编号
        System.out.println("dataMap:"+dataMap);
        return result.put(dataMap);
    }
    /**
     *租客端延期退(查询微信订单的支付状态)
     */
    @Override
    public JsonResult getDelayOrderQuery(Map<String,Object> params){
        JsonResult result=new JsonResult();
        BigDecimal BiMoney=new BigDecimal("0");//账单金额


        Map<String,Object> billMap=new HashMap<String,Object>();
        if (params.get("mch_id")==null || params.get("out_trade_no")==null || params.get("PaId")==null
                || params.get("CorId")==null ||params.get("Source")==null || params.get("total_fee")==null
                || params.get("TenId")==null || params.get("HouId")==null || params.get("HouInfoId")==null
                || params.get("beginDate")==null ||params.get("endDate")==null){
            return result.putFailed("参数不正确");
        }
        BiMoney=new BigDecimal(params.get("total_fee").toString());

        //组装请求查询微信订单的参数
        Map<String,String> paramsXml=new HashMap<String, String>();
        paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
        paramsXml.put("mch_id", params.get("mch_id").toString());//商户号
        paramsXml.put("out_trade_no",params.get("out_trade_no").toString());//商户订单号
        paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串
        paramsXml.put("sign_type",WXPayConstants.SignType.MD5.toString());
        try {
            //签名
            paramsXml.put("sign", WXPayUtil.generateSignature(paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5).toUpperCase());
            System.out.println("签名是否正确1:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
            //查询微信订单的信息
            String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDERQUERY_URL, WXPayUtil.generateSignedXml
                    (paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5));
            System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
            Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
            System.out.println("查询订单返回的信息:"+resultMap);
            if (resultMap.get("return_code").toString().equals("SUCCESS")){
                if (resultMap.get("trade_state").toString().equals("SUCCESS")){
                    //如果支付成功就去修改上一份合同未支付的账单为废弃，然后再新增一个续签账单及续签账单支付信息
                    params.put("Status","4");//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    params.put("IfFlowPay","2");//电子合同是否支付     0无状态   1已完成未支付   \n2已完成已支付  3待审核（水电押金上传之后需要审核）
                    params.put("RentStatus","2");//房租/押金     支付状态   0不需要支付   1.待支付   2支付完成',
                    params.put("Hydropower","2");//水电押金   支付状态   0不需要支付   1.待支付   2支付完成    3待审核
                    params.put("by", "auto");//操作人
                    params.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    params.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(params);

                    //组装续签账单参数
                    Map<String,Object> tenBillMap=new HashMap<String,Object>();
                    //账单编号
                    String UUID="";
                    Map<String,Object>uuid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "BiId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_tenant_bill");
                    }});
                    if(uuid!=null &&(!uuid.get("uuid").toString().equals(""))){
                        Integer number=Integer.valueOf(uuid.get("uuid").toString());
                        UUID= ComUtils.getLocalTrmSeqNum("bi",number);
                    }else{
                        UUID=ComUtils.getLocalTrmSeqNum("bi",0);
                    }
                    //支付信息编号
                    String UUID2="";
                    Map<String,Object>uuid2=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "PayId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_bill_pay");
                    }});

                    if(uuid2!=null &&(!uuid2.get("uuid").toString().equals(""))){
                        Integer number=Integer.valueOf(uuid2.get("uuid").toString());
                        UUID2= ComUtils.getLocalTrmSeqNum("bi",number);
                    }else{
                        UUID2=ComUtils.getLocalTrmSeqNum("bi",0);
                    }
                    tenBillMap.put("BiId",UUID);//账单编号
                    tenBillMap.put("PayId",UUID2);//支付信息编号
                    tenBillMap.put("CorId",params.get("CorId"));//公司编号
                    tenBillMap.put("MainBody",0);//账单主体类型   0.普通账单    1.企业账单
                    tenBillMap.put("BiName","延期退账单");//账单名称
                    tenBillMap.put("IfTemporary",0);//是否是临时账单    0.否   1.是\n没有关联来源
                    tenBillMap.put("BiType",10);//账单类型  1.房租（合同） 2.公共事业费  3.维修费用  \n4.延期退  5.其他费用  6.退租账单 7.夜间开门   8.智能电表  9.续签剩余原合同总账单',10.延期退
                    tenBillMap.put("Source",params.get("Source"));//账单来源编号
                    tenBillMap.put("FirstMon","0");//房租账单是否是首月    0否   1.是
                    tenBillMap.put("BiMoney",BiMoney);//账单金额
                    tenBillMap.put("BillExplain","延期退总金额:"+BiMoney);//账单金额说明,多个逗号隔开
                    tenBillMap.put("BiGenerated",params.get("beginDate"));//账单生成时间
                    tenBillMap.put("EndTime",params.get("beginDate"));//账单生成时间
                    tenBillMap.put("LateDay",params.get("endDate"));//账单最晚付款日
                    tenBillMap.put("TenId",params.get("TenId"));//租客编号
                    tenBillMap.put("HouId",params.get("HouId"));//房源编号
                    tenBillMap.put("HouInfoId",params.get("HouInfoId"));//房源详表编号
                    tenBillMap.put("CreateType",1);//账单创建人类型  1.系统  2.人为
                    tenBillMap.put("ExpStatus",0);//账单逾期状态   0.未逾期  1逾期
                    tenBillMap.put("ExpTime",tenBillMap.get("EndTime"));//逾期开始时间
                    tenBillMap.put("Status",2);//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    tenBillMap.put("Abnormal",0);//账单异常状态   0正常   1异常
                    tenBillMap.put("by", "auto");//操作人
                    tenBillMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenBillMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(tenBillMap);
                    //新增账单
                    seTenantBillMapper.addTenantBill(tenBillMap);
                    //组装支付信息参数
                    Map<String,Object> tenPayMap=new HashMap<String,Object>();
                    tenPayMap.put("PayId",UUID2);
                    tenPayMap.put("TenId",params.get("TenId"));//租客编号
                    tenPayMap.put("Shape",0);//0.线上   1.线下
                    tenPayMap.put("PayMode",1);//支付方式  1.微信  2.支付宝
                    tenPayMap.put("TransactionId",params.get("Source"));//0.线上   1.线下
                    tenPayMap.put("BiMoney",BiMoney);//账单金额
                    tenPayMap.put("PayMoney",params.get("total_fee"));//账单金额
                    tenPayMap.put("Couponcd",params.get("Coucode"));//优惠卷编号
                    tenPayMap.put("Couponamt",params.get("Facevalue"));//优惠卷金额
                    tenPayMap.put("PatStatus",0);//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
                    tenPayMap.put("PatStats",2);//支付状态    1.未支付  2.支付成功
                    tenPayMap.put("by", "auto");//操作人
                    tenPayMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenPayMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(tenPayMap);
                    tenPayMap.put("PayTime",tenPayMap.get("instm"));//本次支付时间
                    //新增支付信息
                    seBillPayMapper.addSeBillPay(tenPayMap);
                    billMap.put("trade_state",resultMap.get("trade_state"));
                }
                billMap.put("return_code",resultMap.get("return_code"));//SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看trade_state来判断
                billMap.put("return_msg",resultMap.get("return_msg"));//当return_code为FAIL时返回信息为错误原因 ，例如签名失败 参数格式校验错误，
                billMap.put("result_code",resultMap.get("result_code"));//业务结果 SUCCESS/FAIL
                billMap.put("err_code",resultMap.get("result_code"));//ORDERNOTEXIST 此交易订单号不存在 SYSTEMERROR 系统错误
                billMap.put("err_code_des",resultMap.get("err_code_des"));//当result_code为FAIL时返回错误描述，
                System.out.println("billMap.:"+billMap);
                result.put(billMap);
            }else{
                result.putFailed("服务器繁忙");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 租客端其他账单微信支付（生成预付订单）
     */
    @Override
    public JsonResult getOtherUnifiedorder(Map<String, Object> params) {
        JsonResult result = new JsonResult();
        Map<String,Object> dataMap=new HashMap<String,Object>();
        BigDecimal total_fee=new BigDecimal("0");//保存账单总价
        //组装请求微信预订单用的参数
        Map<String,String> paramsXml=new HashMap<String,String>();
        if (params.get("openid")==null || params.get("spbill_create_ip")==null
                || params.get("total_fee")==null  || params.get("BiId")==null){
            return result.putFailed("参数不正确");
        }
        //获取权限当前公司的微信支付
        JsonResult zuulResult=zuulFeign.getAreaPayMap(params);
        System.out.println("zuulResult："+zuulResult);
        if (!zuulResult.get("errorCode").toString().equals("0")){
            //如果查询不到就用默认的商户号
            paramsXml.put("mch_id",WeChatConfig.DEFAULT_MCH_ID);//商户号
            dataMap.put("mch_id",paramsXml.get("mch_id"));
            dataMap.put("sub_mch_id","");
            dataMap.put("ServeType","2");
        }else{
            Map<String,Object> zuulMap=(Map<String,Object>)zuulResult.get("result");
            //支付模式      1.服务商模式   2.普通商户\n普通商户没有父商户号
            if (zuulMap.get("ServeType").toString().equals("1")){
                paramsXml.put("mch_id",zuulMap.get("SubMchId").toString());//商户号
                paramsXml.put("sub_mch_id",zuulMap.get("MchId").toString());//商户号
                dataMap.put("mch_id",paramsXml.get("mch_id"));
                dataMap.put("sub_mch_id",paramsXml.get("sub_mch_id"));
            }else{
                paramsXml.put("mch_id",zuulMap.get("MchId").toString());//商户号
                dataMap.put("mch_id",paramsXml.get("mch_id"));
                dataMap.put("sub_mch_id","");
            }
            dataMap.put("ServeType",zuulMap.get("ServeType"));
        }
        //计算本次支付的总和
        total_fee=new BigDecimal(params.get("total_fee").toString());
        params.put("Source",params.get("BiId"));
        System.out.println("total_fee:"+total_fee);
        //查询是否已经有预订单信息如果没有再去请求微信的预订单接口
        Map<String,Object> seBpwMap=seBpwMapper.getSeBpw(params);
        if (seBpwMap==null){
            //返回给前端调起支付用的参数
            Map<String,String> signMap=new HashMap<String, String>();

            paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
            paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串32
            paramsXml.put("body","账单费用-"+total_fee.toString());//订单详情
            paramsXml.put("out_trade_no",params.get("BiId").toString());//商户订单号
//            paramsXml.put("total_fee",total_fee.multiply(new BigDecimal("100")).setScale(0).toString());//标价金额
            paramsXml.put("total_fee","1");//标价金额
            paramsXml.put("spbill_create_ip",params.get("spbill_create_ip").toString());//终端ip
            paramsXml.put("notify_url","http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php");
            paramsXml.put("trade_type","JSAPI");
            paramsXml.put("openid",params.get("openid").toString());
            try {
                paramsXml.put("sign",WXPayUtil.generateSignature(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                System.out.println("签名是否正确1:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
                //发送统一下单请求
                String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDER_URL,WXPayUtil.generateSignedXml
                        (paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5));
                System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
                Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
                System.out.println("微信预订单参数resultMap:"+resultMap);
                //当预订单请求成功的时候保存预订单的信息到数据库中
                if (resultMap.get("return_code").toString().equals("SUCCESS")){
                    //组装返回给前端的JSAPI调用支付参数
                    signMap.put("appId",WeChatConfig.APP_ID);
                    signMap.put("timeStamp",String.valueOf(WXPayUtil.getCurrentTimestamp()));
                    signMap.put("nonceStr",WXPayUtil.generateNonceStr());
                    signMap.put("package","prepay_id="+resultMap.get("prepay_id"));//支付编号
                    signMap.put("signType",WXPayConstants.SignType.MD5.toString());
                    signMap.put("paySign",WXPayUtil.generateSignature(signMap,WxConstant.WECHATPAY_PAY_APPSECRET,WXPayConstants.SignType.MD5).toUpperCase());
                    //保存唤起微信支付的参数
                    Map<String,Object> bpwMap=new HashMap<String,Object>();
                    bpwMap.put("SouType","1");//未支付账单类型   1.房租（合同） 2.公共事业费  3.维修费用  4.延期退审核  5.其他费用  6.退租账单 7.夜间开门
                    bpwMap.put("Source",params.get("BiId"));//账单编号
                    bpwMap.put("appId",WeChatConfig.APP_ID);//公众号appid
                    bpwMap.put("timeStamp",signMap.get("timeStamp"));//时间戳
                    bpwMap.put("nonceStr",signMap.get("nonceStr"));//随机字符串
                    bpwMap.put("prepayId",signMap.get("package"));//微信支付订单编号
                    bpwMap.put("sign",paramsXml.get("sign"));
                    bpwMap.put("paySign",signMap.get("paySign"));//微信签名
                    bpwMap.put("by", "auto");//操作人
                    bpwMap.put("Coucode",params.get("Coucode"));//优惠卷编号
                    bpwMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    bpwMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(bpwMap);
                    seBpwMapper.addSeBpw(bpwMap);
                }
                System.out.println("JSAPI调用支付需要的参数signMap:"+signMap);
                System.out.println("签名是否正确3:"+WXPayUtil.isSignatureValid(signMap,WxConstant.WECHATPAY_PAY_APPSECRET));
            } catch (Exception e) {
                e.printStackTrace();
                result.putFailed("服务器繁忙");
            }
            dataMap.put("signMap",signMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",paramsXml.get("out_trade_no"));//订单号
        }else{
            dataMap.put("signMap",seBpwMap);//唤起微信支付需要的参数
            dataMap.put("out_trade_no",seBpwMap.get("Source"));//订单号
        }
        dataMap.put("total_fee",total_fee);//账单金额
        dataMap.put("mch_id",paramsXml.get("mch_id"));//商户号
        return result.put(dataMap);
    }
    /**
     *租客端其他账单微信支付（查询微信支付订单信息）
     */
    @Override
    public JsonResult getOtherOrderQuery(Map<String,Object> params){
        JsonResult result=new JsonResult();
        BigDecimal BiMoney=new BigDecimal("0");//账单金额
        Map<String,Object> billMap=new HashMap<String,Object>();
        if (params.get("mch_id")==null|| params.get("TenId")==null
                ||params.get("BiId")==null || params.get("total_fee")==null){
            return result.putFailed("参数不正确");
        }
        //账单总金额
        BiMoney=new BigDecimal(params.get("total_fee").toString());
        //组装请求查询微信订单的参数
        Map<String,String> paramsXml=new HashMap<String, String>();
        paramsXml.put("appid",WeChatConfig.APP_ID);//公众号appid
        paramsXml.put("mch_id", params.get("mch_id").toString());//商户号
        paramsXml.put("out_trade_no",params.get("BiId").toString());//商户订单号
        paramsXml.put("nonce_str", WxEncodeUtil.nonceStr());//随机字符串
        paramsXml.put("sign_type",WXPayConstants.SignType.MD5.toString());
        try {
            //签名
            paramsXml.put("sign", WXPayUtil.generateSignature(paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5).toUpperCase());
            System.out.println("签名是否正确:"+WXPayUtil.isSignatureValid(paramsXml,WxConstant.WECHATPAY_PAY_APPSECRET));
            //查询微信订单的信息
            String resultXml=HttpUtilBee.post(WeChatConfig.UNIFIED_ORDERQUERY_URL, WXPayUtil.generateSignedXml
                    (paramsXml, WxConstant.WECHATPAY_PAY_APPSECRET, WXPayConstants.SignType.MD5));
            System.out.println("paramsXml"+WXPayUtil.mapToXml(paramsXml));
            Map<String,String> resultMap=WXPayUtil.xmlToMap(resultXml);
            System.out.println("查询订单返回的信息:"+resultMap);
            if (resultMap.get("return_code").toString().equals("SUCCESS")){
                if (resultMap.get("result_code").toString().equals("SUCCESS") && resultMap.get("trade_state").toString().equals("SUCCESS")){
                    //支付信息编号
                    String UUID="";
                    Map<String,Object>uuid=utilsMapper.getUUID(new HashMap<String,Object>(){{
                        put("uuid", "PayId");
                        put("database", Constants.DATA_SOURCE_GMIO);
                        put("surface", "tcgmio_bill_pay");
                    }});
                    if(uuid!=null &&(!uuid.get("uuid").toString().equals(""))){
                        Integer number=Integer.valueOf(uuid.get("uuid").toString());
                        UUID= ComUtils.getLocalTrmSeqNum("bp",number);
                    }else{
                        UUID=ComUtils.getLocalTrmSeqNum("bp",0);
                    }
                    //组装修改账单的参数
                    Map<String,Object> tenBillMap=new HashMap<String,Object>();
                    tenBillMap.put("BiId",params.get("BiId"));//账单编号
                    tenBillMap.put("PayId",UUID);//支付信息编号
                    tenBillMap.put("Status",2);//账单状态   1.待支付  2.支付完成  3待审核   4.账单废弃（租客违约）
                    tenBillMap.put("by", "auto");//操作人
                    tenBillMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenBillMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonUpdateParms(tenBillMap);
                    //修改账单为已支付
                    seTenantBillMapper.updateSeBillStatus(tenBillMap);
                    //组装支付信息参数
                    Map<String,Object> tenPayMap=new HashMap<String,Object>();
                    tenPayMap.put("PayId",UUID);
                    tenPayMap.put("TenId",params.get("TenId"));//租客编号
                    tenPayMap.put("Shape",0);//0.线上   1.线下
                    tenPayMap.put("PayMode",1);//支付方式  1.微信  2.支付宝
                    tenPayMap.put("TransactionId",params.get("BiId"));//0.线上   1.线下
                    tenPayMap.put("BiMoney",BiMoney);//账单金额
                    tenPayMap.put("PayMoney",params.get("total_fee"));//账单金额
                    tenPayMap.put("Couponcd",params.get("Coucode"));//优惠卷编号
                    tenPayMap.put("Couponamt",params.get("Facevalue"));//优惠卷金额
                    tenPayMap.put("PatStatus",0);//支付订单审核状态   0订单无需审核（线上）   1.待审核  2.审核驳回  3.审核通过
                    tenPayMap.put("PatStats",2);//支付状态    1.未支付  2.支付成功
                    tenPayMap.put("by", "auto");//操作人
                    tenPayMap.put("term", "1");// 创建端 Insert端： 1 租客端 2市场部 3 工程部   4运营部   5财务部  6总经办 7发展部
                    tenPayMap.put("fnc",
                            this.getClass().getSimpleName() + "." + Thread.currentThread().getStackTrace()[1].getMethodName());// 创建Function名
                    ParamsCommon.commonInsertParms(tenPayMap);
                    tenPayMap.put("PayTime",tenPayMap.get("instm"));//本次支付时间
                    //新增支付信息
                    seBillPayMapper.addSeBillPay(tenPayMap);
                    billMap.put("trade_state",resultMap.get("trade_state"));//支付是否成功 在return_code 、result_code、trade_state都为SUCCESS时有返回
                }
                billMap.put("return_code",resultMap.get("return_code"));//SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看trade_state来判断
                billMap.put("return_msg",resultMap.get("return_msg"));//当return_code为FAIL时返回信息为错误原因 ，例如签名失败 参数格式校验错误，
                billMap.put("result_code",resultMap.get("result_code"));//业务结果 SUCCESS/FAIL
                billMap.put("err_code",resultMap.get("err_code"));//ORDERNOTEXIST 此交易订单号不存在 SYSTEMERROR 系统错误
                billMap.put("err_code_des",resultMap.get("err_code_des"));//当result_code为FAIL时返回错误描述，
                System.out.println("billMap.:"+billMap);
                result.put(billMap);
            }else{
                result.putFailed("服务器繁忙");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

}
